Loyn (1987) selected 56 forest patches in southeastern Victoria, Australia, and related the abundance of forest birds in each patch to six predictor variables: patch area (ha), distance to nearest patch (km), distance to nearest larger patch (km), grazing stock (1 to 5 indicating light to heavy), altitude (m) and years since isolation (years). The aim was to develop a predictive model relating bird abundance to these predictors and to assess which predictors were most important for bird abundance.

Tawny Frogmouth, Podargus strigoides. Mick Keough, CC BY 4.0

Eastern Yellow Robin, Eopsaltria australis. Emmet Keough, CC BY 4.0

This data set was used in the first edition and is available here

Preliminaries

First, load the required packages (car, lm.beta, hier.part)

Import loyn data file (loyn.csv)

loyn <- read.csv("../data/loyn.csv")
head(loyn,10)
NA

Check distributions of predictors and look for correlations

We will use the scatterplotMatrix function from the car package

scatterplotMatrix(~abund+area+dist+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

abund looks symmetrical but two unusual observations for area resulting in non-linear relationships with abund and one outlier for distance to nearest patch

Try log(10) transformation of area and dist

scatterplotMatrix(~abund+log10(area)+log10(dist)+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

Plots look much better. Now transform the variables in loyn

loyn$logarea <- log10(loyn$area)
loyn$logdist <- log10(loyn$dist)

Now check for collinearity among predictors (using larea and ldist)

Use correlations and VIF

scatterplotMatrix(~logarea+logdist+graze+alt+yearisol, data=loyn, cex=0.33, regLine=FALSE, diagonal=list(method='boxplot'))

cor(loyn[,c('logarea','logdist','graze','alt','yearisol')])
            logarea     logdist      graze        alt    yearisol
logarea   1.0000000  0.30216662 -0.5590886  0.2751428  0.27841452
logdist   0.3021666  1.00000000 -0.1426392 -0.2190070 -0.01957223
graze    -0.5590886 -0.14263922  1.0000000 -0.4071671 -0.63556710
alt       0.2751428 -0.21900701 -0.4071671  1.0000000  0.23271541
yearisol  0.2784145 -0.01957223 -0.6355671  0.2327154  1.00000000
vif(lm(abund~ logarea+logdist+graze+alt+yearisol, data=loyn))
 logarea  logdist    graze      alt yearisol 
1.619373 1.265608 2.522813 1.364838 1.735318 

Collinearity OK so now fit linear model relating response to predictor

loyn.lm <- lm(abund~ logarea+logdist+graze+alt+yearisol, data=loyn)

Examine regression diagnostics (residual plot and Cooks D)

plot(loyn.lm)

augment(loyn.lm)

Display results of model fitting

Get parameter estimates, their confidence intervals, and tests

tidy(loyn.lm, conf.int=TRUE)

Get standarised regression coefficients

Use lm.beta function from lm.beta package

lm.beta.loyn <- lm.beta(loyn.lm)
tidy(lm.beta.loyn, conf.int=TRUE)

Show the partial regression (added-variable) plots

avPlots(loyn.lm, ask=F)

Run hierarchical partitioning (used later)

We need two dataframes that are subsets of loyn containing the response variable and the predictors

loyn_abund<-loyn$abund
loyn_pred<-subset(loyn, select = c("logarea","logdist","alt","yearisol","graze"))
hier.part(loyn_abund, loyn_pred, family="gaussian", gof="Rsqu")
$gfs
 [1] 0.0000000 0.5476530 0.0160588 0.1488696 0.2533690 0.4658218 0.5579841 0.5835769 0.6434808 0.6527344 0.1957330 0.2720289 0.4667023 0.3297010 0.4797883 0.4739432 0.5852970
[18] 0.6479714 0.6609983 0.6628587 0.6610593 0.6732151 0.3707161 0.4845809 0.4758029 0.4887284 0.6634401 0.6651442 0.6787941 0.6823418 0.4960985 0.6843360

$IJ

$I.perc

$params
$params$full.model
[1] "y ~ logarea + logdist + alt + yearisol + graze"

$params$family
[1] "gaussian"

$params$link
[1] "default"

$params$gof
[1] "Rsqu"

LS0tCnRpdGxlOiAiUUsgQm94IDguMiIKCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBmbGF0bHkKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCkxveW4gKDE5ODcpIHNlbGVjdGVkIDU2IGZvcmVzdCBwYXRjaGVzIGluIHNvdXRoZWFzdGVybiBWaWN0b3JpYSwgQXVzdHJhbGlhLCBhbmQgcmVsYXRlZCB0aGUgYWJ1bmRhbmNlIG9mIGZvcmVzdCBiaXJkcyBpbiBlYWNoIHBhdGNoIHRvIHNpeCBwcmVkaWN0b3IgdmFyaWFibGVzOiBwYXRjaCBhcmVhIChoYSksIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGF0Y2ggKGttKSwgZGlzdGFuY2UgdG8gbmVhcmVzdCBsYXJnZXIgcGF0Y2ggKGttKSwgZ3JhemluZyBzdG9jayAoMSB0byA1IGluZGljYXRpbmcgbGlnaHQgdG8gaGVhdnkpLCBhbHRpdHVkZSAobSkgYW5kIHllYXJzIHNpbmNlIGlzb2xhdGlvbiAoeWVhcnMpLiBUaGUgYWltIHdhcyB0byBkZXZlbG9wIGEgcHJlZGljdGl2ZSBtb2RlbCByZWxhdGluZyBiaXJkIGFidW5kYW5jZSB0byB0aGVzZSBwcmVkaWN0b3JzIGFuZCB0byBhc3Nlc3Mgd2hpY2ggcHJlZGljdG9ycyB3ZXJlIG1vc3QgaW1wb3J0YW50IGZvciBiaXJkIGFidW5kYW5jZS4KCiFbVGF3bnkgRnJvZ21vdXRoLCBQb2Rhcmd1cyBzdHJpZ29pZGVzLiBNaWNrIEtlb3VnaCwgW0NDIEJZIDQuMF0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8pXSguLi9tZWRpYS9mcm9nbW91dGguanBnKQoKIVtFYXN0ZXJuIFllbGxvdyBSb2JpbiwgKkVvcHNhbHRyaWEgYXVzdHJhbGlzKi4gRW1tZXQgS2VvdWdoLCBbQ0MgQlkgNC4wXShodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvNC4wLyldKC4uL21lZGlhL3JvYmluLmpwZykKClRoaXMgZGF0YSBzZXQgd2FzIHVzZWQgaW4gdGhlIGZpcnN0IGVkaXRpb24gYW5kIGlzIGF2YWlsYWJsZSBbaGVyZV0oZGF0YS9sb3luLmNzdikKCiMjIyBQcmVsaW1pbmFyaWVzCgpGaXJzdCwgbG9hZCB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKGNhciwgbG0uYmV0YSwgaGllci5wYXJ0KQoKYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnNvdXJjZSgiLi4vUi9saWJyYXJpZXMuUiIpICAgI1RoaXMgaXMgdGhlIGNvbW1vbiBsaWJyYXJ5CmxpYnJhcnkobG0uYmV0YSkKbGlicmFyeShoaWVyLnBhcnQpCmBgYAoKSW1wb3J0IGxveW4gZGF0YSBmaWxlIChsb3luLmNzdikKCmBgYHtyfQpsb3luIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2xveW4uY3N2IikKaGVhZChsb3luLDEwKQoKYGBgCgojIyMgQ2hlY2sgZGlzdHJpYnV0aW9ucyBvZiBwcmVkaWN0b3JzIGFuZCBsb29rIGZvciBjb3JyZWxhdGlvbnMKCldlIHdpbGwgdXNlIHRoZSBzY2F0dGVycGxvdE1hdHJpeCBmdW5jdGlvbiBmcm9tIHRoZSBjYXIgcGFja2FnZQoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+YWJ1bmQrYXJlYStkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luLCBjZXg9MC4zMywgcmVnTGluZT1GQUxTRSwgZGlhZ29uYWw9bGlzdChtZXRob2Q9J2JveHBsb3QnKSkKYGBgCgphYnVuZCBsb29rcyBzeW1tZXRyaWNhbCBidXQgdHdvIHVudXN1YWwgb2JzZXJ2YXRpb25zIGZvciBhcmVhIHJlc3VsdGluZyBpbiBub24tbGluZWFyIHJlbGF0aW9uc2hpcHMgd2l0aCBhYnVuZCBhbmQgb25lIG91dGxpZXIgZm9yIGRpc3RhbmNlIHRvIG5lYXJlc3QgcGF0Y2gKCiMjIyMgVHJ5IGxvZygxMCkgdHJhbnNmb3JtYXRpb24gb2YgYXJlYSBhbmQgZGlzdAoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+YWJ1bmQrbG9nMTAoYXJlYSkrbG9nMTAoZGlzdCkrZ3JhemUrYWx0K3llYXJpc29sLCBkYXRhPWxveW4sIGNleD0wLjMzLCByZWdMaW5lPUZBTFNFLCBkaWFnb25hbD1saXN0KG1ldGhvZD0nYm94cGxvdCcpKQpgYGAKClBsb3RzIGxvb2sgbXVjaCBiZXR0ZXIuIE5vdyB0cmFuc2Zvcm0gdGhlIHZhcmlhYmxlcyBpbiBsb3luCgpgYGB7ciB9CmxveW4kbG9nYXJlYSA8LSBsb2cxMChsb3luJGFyZWEpCmxveW4kbG9nZGlzdCA8LSBsb2cxMChsb3luJGRpc3QpCmBgYAoKIyMjIE5vdyBjaGVjayBmb3IgY29sbGluZWFyaXR5IGFtb25nIHByZWRpY3RvcnMgKHVzaW5nIGxhcmVhIGFuZCBsZGlzdCkKClVzZSBjb3JyZWxhdGlvbnMgYW5kIFZJRgoKYGBge3IgfQpzY2F0dGVycGxvdE1hdHJpeCh+bG9nYXJlYStsb2dkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luLCBjZXg9MC4zMywgcmVnTGluZT1GQUxTRSwgZGlhZ29uYWw9bGlzdChtZXRob2Q9J2JveHBsb3QnKSkKY29yKGxveW5bLGMoJ2xvZ2FyZWEnLCdsb2dkaXN0JywnZ3JhemUnLCdhbHQnLCd5ZWFyaXNvbCcpXSkKdmlmKGxtKGFidW5kfiBsb2dhcmVhK2xvZ2Rpc3QrZ3JhemUrYWx0K3llYXJpc29sLCBkYXRhPWxveW4pKQpgYGAKCkNvbGxpbmVhcml0eSBPSyBzbyBub3cgZml0IGxpbmVhciBtb2RlbCByZWxhdGluZyByZXNwb25zZSB0byBwcmVkaWN0b3IKCmBgYHtyIH0KbG95bi5sbSA8LSBsbShhYnVuZH4gbG9nYXJlYStsb2dkaXN0K2dyYXplK2FsdCt5ZWFyaXNvbCwgZGF0YT1sb3luKQpgYGAKCiMjIyBFeGFtaW5lIHJlZ3Jlc3Npb24gZGlhZ25vc3RpY3MgKHJlc2lkdWFsIHBsb3QgYW5kIENvb2tzIEQpCgpgYGB7ciB9CnBsb3QobG95bi5sbSkKYXVnbWVudChsb3luLmxtKQpgYGAKCiMjIyBEaXNwbGF5IHJlc3VsdHMgb2YgbW9kZWwgZml0dGluZwoKR2V0IHBhcmFtZXRlciBlc3RpbWF0ZXMsIHRoZWlyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhbmQgdGVzdHMKYGBge3IgfQp0aWR5KGxveW4ubG0sIGNvbmYuaW50PVRSVUUpCmBgYAoKIyMjIEdldCBzdGFuZGFyaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cwoKVXNlIGxtLmJldGEgZnVuY3Rpb24gZnJvbSBsbS5iZXRhIHBhY2thZ2UKCmBgYHtyIH0KbG0uYmV0YS5sb3luIDwtIGxtLmJldGEobG95bi5sbSkKdGlkeShsbS5iZXRhLmxveW4sIGNvbmYuaW50PVRSVUUpCmBgYAoKU2hvdyB0aGUgcGFydGlhbCByZWdyZXNzaW9uIChhZGRlZC12YXJpYWJsZSkgcGxvdHMKCmBgYHtyIH0KYXZQbG90cyhsb3luLmxtLCBhc2s9RikKYGBgCgojIyMgUnVuIGhpZXJhcmNoaWNhbCBwYXJ0aXRpb25pbmcgKHVzZWQgbGF0ZXIpCgpXZSAgbmVlZCB0d28gZGF0YWZyYW1lcyB0aGF0IGFyZSBzdWJzZXRzIG9mIGxveW4gY29udGFpbmluZyB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYW5kIHRoZSBwcmVkaWN0b3JzCgpgYGB7cn0KbG95bl9hYnVuZDwtbG95biRhYnVuZApsb3luX3ByZWQ8LXN1YnNldChsb3luLCBzZWxlY3QgPSBjKCJsb2dhcmVhIiwibG9nZGlzdCIsImFsdCIsInllYXJpc29sIiwiZ3JhemUiKSkKYGBgCgpgYGB7cn0KaGllci5wYXJ0KGxveW5fYWJ1bmQsIGxveW5fcHJlZCwgZmFtaWx5PSJnYXVzc2lhbiIsIGdvZj0iUnNxdSIpCmBgYAo=